﻿using System;
using System.Collections;
using System.Data;
using MySql.Data.MySqlClient;

public class TDatosDeUsuario : SuperT
{
    #region Atributos de la Clase
    /// \brief Nombre del atributo de la BD que almacena el nombre del usuario.
    private string cNombre = "nombreusuario";
    /// \brief Nombre del atributo de la BD que almacena el login del usuario.
    private string cLogin = "loginusuario";
    /// \brief Nombre del atributo de la BD que almacena el estado de actividad del usuario.
    private string cPassword = "passwordusuario";
    #endregion

    #region Tamaño de los atributos cadena
    // Tamaños de los atributos cadena.
    public const int TAM_NOMBRE = 255;
    public const int TAM_LOGIN = 45;
    public const int TAM_PASSWORD = 6;
    #endregion

    #region Constructor
    /**
        * \brief Constructor de la clase TDatosDeUsuario.
        * \pre El valor del objeto conexion no puede ser nulo.
        * \return El obteto TDatosDeUsuario inicializado y listo para ser usado
        */
    public TDatosDeUsuario(MySqlConnection pConexion)
        : base(pConexion, "usuarios") 
    {
        //Sin código
    }
    #endregion

    #region Consultas

    protected override ColEncapsulados consultarDataTable(DataRowCollection pFilas)
    {
        try
        {
            ColDatosDeUsuarios usuarios = new ColDatosDeUsuarios();
            foreach (DataRow r in pFilas)
            {
                usuarios.añadir(new DatosDeUsuario(Convert.ToUInt64(r[this.cId]),
                                                Convert.ToString(r[this.cNombre]),
                                                Convert.ToString(r[this.cLogin]),
                                                Convert.ToString(r[this.cPassword])));
            }

            return usuarios;
        }
        catch (Exception)
        {
            throw new Exception("Error: metodo consultarDataTable; clase TDatosDeUsuario");
        }
    }

    /**
        * \brief Obtiene todos los usuarios existentes.
        * \return Coleccion de objetos de la clase DatosDeUsuario existentes en la BD.
        */
    public virtual ColDatosDeUsuarios getDatosDeUsuarioTodos()
    {
        DataTable tabla = this.rellenarDataTable(this.getSQLTabla(), EnumTiposDeAccion.Consultar);

        return (ColDatosDeUsuarios)this.consultarDataTable(tabla.Rows);
    }
    /**
        * \brief Obtiene un objeto de la clase DatosDeUsuario de unidad existentes.
        * \param pIdUsuario - Identificador del objeto
        * \return Objeto de la clase DatosDeUsuario existentes en la BD.
        */
    public virtual DatosDeUsuario getDatosDeUsuarioById(ulong pIdUsuario)
    {
        try
        {
            string filtro = this.cId + "=" + pIdUsuario;
            string sql = "SELECT * FROM " + this.NombreTabla + " WHERE " + filtro;

            DataTable tabla = this.rellenarDataTable(sql, EnumTiposDeAccion.Consultar);

            ColDatosDeUsuarios datosDeUsuarios = (ColDatosDeUsuarios)this.consultarDataTable(tabla.Rows);
            DatosDeUsuario datosDeUsuario = datosDeUsuarios.getUsuarioById(pIdUsuario);

            if(datosDeUsuario == null)
                throw new Exception("Error: metodo getDatosDeUsuarioByIdUsuario; clase TDatosDeUsuario; No existe ningún usuario con idUsuario = " + pIdUsuario);

            return datosDeUsuario;
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
    }
    /**
        * \brief Obtiene un objetos de la clase DatosDeUsuario de unidad existentes.
        * \param pLogin - Login del usuario 
        * \return Objeto de la clase DatosDeUsuario existentes en la BD.
        */
    public virtual DatosDeUsuario getDatosDeUsuarioByLogin(string pLogin)
    {
        try
        {
            string filtro = this.cLogin + "='" + pLogin + "'";
            string sql = "SELECT * FROM " + this.NombreTabla + " WHERE " + filtro;

            DataTable tabla = this.rellenarDataTable(sql, EnumTiposDeAccion.Consultar);

            ColDatosDeUsuarios datosDeUsuarios = (ColDatosDeUsuarios)this.consultarDataTable(tabla.Rows);
            DatosDeUsuario datosDeUsuario = datosDeUsuarios.getUsuarioByLogin(pLogin);

            return datosDeUsuario;
        }
        catch (Exception)
        {
            throw new Exception("Error: metodo getDatosDeUsuarioByLogin; clase TDatosDeUsuario");
        }
    }

    #endregion

    #region Insertar/Modificar/Eliminar

    protected override void insertar(ColEncapsulados pColeccion)
    {
        DatosDeUsuario usuarioActual = null;

        try
        {
            DataRow r;

            // Rellenamos el DataTable vacío para coger la estructura de la tabla
            this.miTabla = this.rellenarDataTable(this.getSQLTablaVacia(), EnumTiposDeAccion.Insertar);

            foreach (DatosDeUsuario usuario in (ColDatosDeUsuarios)pColeccion)
            {
                usuarioActual = usuario;
                r = this.miTabla.NewRow();

                r[this.cId] = usuario.Id;
                r[this.cNombre] = usuario.Nombre;
                r[this.cLogin] = usuario.Login;
                r[this.cPassword] = usuario.Password;

                this.miTabla.Rows.Add(r);
            }
        }
        catch (MySqlException)
        {
            this.miTabla.RejectChanges();
            if (this.miTabla.Select(this.cLogin + " = '" + usuarioActual.Login + "'").Length > 0)
                throw new Exception("Error: Método insertar; Clase TDatosDeUsuarios; El ususario " + usuarioActual.Login + " ya existe.");
            else
                throw new Exception("Error: Método insertar; Clase TDatosDeUsuarios.");
        }
        catch (Exception)
        {
            throw new Exception("Error: Método insertar; Clase TDatosDeUsuarios.");
        }
    }
    public void insertarDatosDeUsuarios(ColDatosDeUsuarios pColeccion)
    {

        this.insertar(pColeccion);
    }

    protected override void modificar(ColEncapsulados pColeccion)
    {            
        DatosDeUsuario usuarioActual = null;
        try
        {
            // Objeto que contendrá el atributo por el que se realizará la búsqueda.
            Object clave;
            DataRow r;

            // Rellenamos el DataTable con los objetos de la coleccion
            string filtro = Herramientas.convertirAFiltroSQL(this.cId, ((ColDatosDeUsuarios)pColeccion).getIdsDatosDeUsuarios());
            string sql = "SELECT * FROM " + this.NombreTabla + " WHERE " + filtro;

            this.miTabla = this.rellenarDataTable(sql, EnumTiposDeAccion.Modificar);

            foreach (DatosDeUsuario usuario in (ColDatosDeUsuarios)pColeccion)
            {
                clave = usuario.Id;
                // Se obtiene la fila de la tabla que cumple dicha condición.
                r = this.miTabla.Rows.Find(clave);
                // Si hay filas, 
                if (r != null)
                {
                    // Se modifican los datos de la entidad.
                    r[this.cNombre] = usuario.Nombre;
                    r[this.cLogin] = usuario.Login;
                    r[this.cPassword] = usuario.Password;
                }
                // Si no hay filas,
                else
                {
                    // Se lanza una excepción.
                    throw new Exception("Error: Método modificar; Clase TDatosDeUsuarios; No existe " + usuario.ToString());
                }
            }
        }
        catch (MySqlException)
        {
            this.miTabla.RejectChanges();
            if (this.miTabla.Select(this.cLogin + " = '" + usuarioActual.Login + "'").Length > 0)
                throw new Exception("Error: Método modificar; Clase TDatosDeUsuarios; El ususario " + usuarioActual.Login + " ya existe.");
            else
                throw new Exception("Error: Método modificar; Clase TDatosDeUsuarios.");
        }
        catch (Exception)
        {
            throw new Exception("Error: Método modificar; Clase TDatosDeUsuarios.");
        }
    }

    public void modificarDatosDeUsuarios(ColDatosDeUsuarios pColeccion)
    {
        this.modificar(pColeccion);
    }

    protected override void eliminar(ColEncapsulados pColeccion) 
    {
        //Sin código
    }
    #endregion

}
